package com.example.jee_springboot.jpa.service;

import com.example.jee_springboot.jpa.dto.Stu2DTO;
import com.example.jee_springboot.jpa.entity.Stu2;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import javax.swing.text.html.parser.Entity;
import javax.transaction.Transactional;
import java.util.ArrayList;
import java.util.List;
@Slf4j
@Service
public class Stu2Service {

    @Autowired
    EntityManager entityManager;

    @Transactional

    public void save(){
        Stu2 stu2=new Stu2();
        stu2.setUsername("jpa-1");
        stu2.setMath(98);
        stu2.setJava(100);
        entityManager.persist(stu2);
    }

    public List<Stu2> FindAll(){
        List<Stu2> res=entityManager.createQuery("from Stu2",Stu2.class).getResultList();
        return res;
    }

    public Stu2 findById(long id){
        return  entityManager.find(Stu2.class,id);
    }


    public void delById(long id){
       Query query=  entityManager.createQuery("delete from Stu2 where id=:id");
       query.setParameter("id",id);
       query.executeUpdate();
    }

//////////////////////////非持久化
    public void noInTx(){
       Stu2 res= entityManager.find(Stu2.class,2L);
       res.setMath(60);
    }

@Transactional//持久化 可以自动保存更新
    public void inTx(){
        Stu2 res= entityManager.find(Stu2.class,2L);
        res.setMath(60);
        res.setMath(90);
    }

    @Transactional//变成detached状态 游离状态
    public void inTxAfterClear(){
        Stu2 res=entityManager.find(Stu2.class,2L);
        entityManager.clear();//变成detached状态 游离状态
        res.setMath(1000);//处于游离状态
    }

    @Transactional//持久化处理  变为持久化状态
    public void merge(){
        Stu2 res=entityManager.find(Stu2.class,2L);
        entityManager.clear();//变成detached状态 游离状态
        res.setMath(1000);//处于游离状态
        entityManager.merge(res);//持久化处理  变为持久化状态
    }

    @Transactional//////////////////////////////利用面向对象的方式创建查询
    public void queryByCrteriaBuilder(){
        CriteriaBuilder cb=entityManager.getCriteriaBuilder();//创建规则构建器
        CriteriaQuery cq=cb.createQuery(Long.class);//结果类型,Long.class

        Root<Stu2> root=cq.from(Stu2.class);//从哪个实体创建查询
        //select
//        cq.select(root.get("id"));
        //select
        cq.select(cb.tuple(root.get("id")));
        //where
        List<Predicate> predicates=new ArrayList<>();
        predicates.add(cb.ge(root.get("java"),95));
        predicates.add(cb.like(root.get("username"), "%e%"));
        //order
        cq.orderBy(cb.desc(root.get("id")));
        entityManager.createQuery(cq).getResultList().forEach(id->log.debug("{}",id));
    }


    @Transactional
    public void queryPartByCrteriaBuilder(){//Stu stu  返回部分值
        CriteriaBuilder cb=entityManager.getCriteriaBuilder();
        CriteriaQuery cq=cb.createQuery(Stu2DTO.class);//结果类型,Stu2DTO.class
        //from
        Root<Stu2> root=cq.from(Stu2.class);//从哪个实体创建查询  类似于from语句==“from order ”
        //select
        cq.multiselect(root.get("username"),root.get("java"));//获取多个值
        //where
        //Predicate 过滤条件
        List<Predicate> predicates=new ArrayList<>();
        predicates.add(cb.ge(root.get("java"),95));//ge 大于等于
        predicates.add(cb.like(root.get("username"), "%e%"));
        //order
        cq.orderBy(cb.desc(root.get("id")));

        TypedQuery query = entityManager.createQuery(cq);
        query.setFirstResult(1);//setFirstResult表示从第几条记录开始
        query.setMaxResults(2);// setMaxResults 是每页要查询的条数。
        query.getResultList().forEach(dto->log.debug("{}",dto));
    }
}
